iT邦幫忙

0

iOS APP 開發 OC 第二十四天,funtion 參數是否可以nil?

  • 分享至 

  • xImage
  •  
tags: OC 30 day

我在swift讀書會上發起了這個疑問,得到非常多人的解惑,因此發起這篇文章。

寫swift 時,會很常用到這樣的語法:

func method(a:String?)

這段程式碼的意思就是說,a 這個參數是可以為nil的,他可以存在也可以不存在。
這段語法究竟是能在Objective-C上實現的嗎?

可以的,如以下的程式碼就是

Objective-C 的可選語法

- (void)method:(nullable NSString *)a;

我們在宣告type的地方加上標記,nullable nonull都是標記是否能nil。如字面上的意思做以下解釋。

nullable

可以是null的

nonull

不可以null

值得注意的是,Objective-C 的語法語swift 是不同的。

1. nonull僅僅是在compile時幫你檢查而已,動態沒處理一樣Crash。

因為 Objective-C null 檢查是不嚴謹的,在語言特性有很大的彈性同時,需要做的處理自然就會變多,這就是動態語言的特性了。

那麼,如果method 沒有nil有處理,如果又給了nil 是不是就carsh了?

沒錯的...

2. nullable 與僅有標籤的意義,實質上是沒有任何處理的。

Objective-C 在swift 出來之前,method 的參數是否能 nil 都是要去查文件才能知道,nullable 與 nonull 在method描述上就能知道是否能給nil了。

另外語法特性的差異還有下面這點:

參數在呼叫時,不能省略

在swift的語法,可以透過以下語法讓參數可以省略:

宣告時:

func method(a:String,b:String?){

}

呼叫時

method(a:str)

我們可以看到,因為參數b 我們不給他值,那麼我們可以直接忽略他,在Objective-C上有類似的語法嗎?

在 Objective-C 的語法:

宣告時

- (void)method:(NSString *)a :(nullable NSString *)b{

}

呼叫時

[self method:str :nil];

以上的語法證實,沒辦法省略。儘管你沒有要給a 這個參數,你勢必還是要給 nil。

難道,就真的沒辦法省略嗎?還是可以的

利用 overload 的特性實踐,不同的參數需求

宣告時

- (void)method:(NSString *)a :(NSString *)b{

}

- (void)method:(NSString *)a{

}

呼叫時

[self method:str];

總結

用以上語法,可以實踐出省略的效果,但是我們要注意的是,他的本質意義上是與不給值而省略不同。在 method 的參數上無論做了nullable描述,都必須要自行 nil 處理。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言